// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_
#define GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_

#include <memory>

#include "gpu/gpu_export.h"
//#include "gpu/ipc/common/surface_handle.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_memory_buffer.h"

namespace gpu {

struct SyncToken;

typedef void* SurfaceHandle;

extern SurfaceHandle kNullSurfaceHandle;

class GPU_EXPORT GpuMemoryBufferManager {
public:
    GpuMemoryBufferManager();

    // Allocates a GpuMemoryBuffer that can be shared with another process.
    virtual std::unique_ptr<gfx::GpuMemoryBuffer> AllocateGpuMemoryBuffer(
        const gfx::Size& size,
        gfx::BufferFormat format,
        gfx::BufferUsage usage,
        gpu::SurfaceHandle surface_handle)
        = 0;

    // Creates a GpuMemoryBuffer from existing handle.
    virtual std::unique_ptr<gfx::GpuMemoryBuffer> CreateGpuMemoryBufferFromHandle(
        const gfx::GpuMemoryBufferHandle& handle,
        const gfx::Size& size,
        gfx::BufferFormat format)
        = 0;

    // Returns a GpuMemoryBuffer instance given a ClientBuffer. Returns NULL on
    // failure.
    virtual gfx::GpuMemoryBuffer* GpuMemoryBufferFromClientBuffer(
        ClientBuffer buffer)
        = 0;

    // Associates destruction sync point with |buffer|.
    virtual void SetDestructionSyncToken(gfx::GpuMemoryBuffer* buffer,
        const gpu::SyncToken& sync_token)
        = 0;

protected:
    virtual ~GpuMemoryBufferManager();
};

} // namespace gpu

#endif // GPU_COMMAND_BUFFER_CLIENT_GPU_MEMORY_BUFFER_MANAGER_H_
